use [gd1c2011]
GO
--select * from gd_esquema.maestra where cli_dni = 1000000


--
-- =========================================================================================================
--
IF OBJECT_ID ('LAG.sp_login','P') IS NOT NULL
    DROP PROCEDURE LAG.sp_login ;
GO
CREATE PROCEDURE LAG.sp_login
	@arg_usuario  varchar(max) ,
	@arg_password varchar(max)
AS
BEGIN
	declare @err_msg varchar(max) , @error int ;
	declare @v_errmsg varchar(max) , @v_errcode int ;
	declare @v_idUsuario int , @v_idPersona int , @v_idTipoUsu int , @v_idSucursal int , @v_status nchar(1)  ;
	declare @v_usuario nvarchar(max) , @v_password nvarchar(max) , @v_intentosFallidos int ;
	set transaction isolation level read committed /*esto establece como nivel de aislamiento read committed y lockea la tabla a nivel fila*/
	BEGIN TRY
		BEGIN TRANSACTION
		--
		set @v_errmsg = '??: situacion no considerada en el codigo' ;
		set @v_errcode = -1 ;
		SELECT 
			@v_idUsuario = idUsuario , 
			@v_idPersona = idPersona , 
			@v_idTipoUsu = idTipoUsu , 
			@v_idSucursal = idSucursal , 
			@v_status = status , 
			@v_usuario = usuario , 
			@v_password = password , 
			@v_intentosFallidos = intentosFallidos
		FROM LAG.usuarios 
		WHERE usuario = @arg_usuario ;
		-- verificamos si el usuario ingresado existe 
		print @v_idUsuario 
		print @v_intentosFallidos
		print '--'
		if ( @v_idUsuario is NULL )
		begin
			-- el nombre de usuario no existe
			set @v_errmsg = 'el usuario y/o password son incorrectos.' ;
			set @v_errcode = -10 ;
		end
		else if( @v_status <> '1' AND @v_password = @arg_password )
		begin
			-- usuario y password correctos , pero el usuario esta inhabilitado.
			set @v_errmsg = 'usuario inhabilitado. consulte al administrador del sistema.' ;
			set @v_errcode = -11 ;
		end  
		else if( @v_status <> '1'  AND @v_password <> @arg_password )
		begin
			-- el usuario esta inhabilitado e ingreso incorrectamente el password.
			set @v_errmsg = 'usuario inhabilitado' ;
			set @v_errcode = -12 ;
		end  
		else if( @v_password <> @arg_password )
		begin
			-- el usuario es correcto , el password es incorrecto.
			set @v_errmsg = 'el usuario y/o password son incorectos.' ;
			if( @v_intentosFallidos >= 2 )
			begin
				set @v_errcode = -15 ;
				UPDATE LAG.usuarios SET status = '0' , intentosFallidos = @v_intentosFallidos + 1 where idUsuario = @v_idUsuario ;
			end
			else
			begin
				set @v_errcode = -16 ;
				UPDATE LAG.usuarios SET intentosFallidos = @v_intentosFallidos + 1 where idUsuario = @v_idUsuario ;
			end
		end
		else if( @v_password = @arg_password )
		begin
			-- el user y pass estan OK  y ademas el usuario esta habilitado , con status='1'	
			set @v_errmsg = 'User y password OK' ;
			set @v_errcode = 0 ;
			UPDATE LAG.usuarios SET intentosFallidos = 0 where idUsuario = @v_idUsuario ;
		end
		COMMIT TRANSACTION
		--
		SELECT 
			@v_idUsuario  AS idUsuario , 
			@v_idPersona  AS idPersona , 
			@v_idTipoUsu  AS idTipoUsu , 
			@v_idSucursal AS idSucursal , 
			@v_status     AS status , 
			@v_usuario    AS usuario , 
			@v_password   AS password , 
			@v_intentosFallidos AS intentosFallidos ,
			@v_errmsg	  AS errmsg ,
			@v_errcode    AS errcode
			;
	END TRY
	BEGIN CATCH		ROLLBACK TRANSACTION			if( @@error = 0 )			RAISERROR(@err_msg,14,1) ;		else		begin			SET @err_msg = LAG.getErrorMessage(@@error) ;			RAISERROR(@err_msg,14,1) ;		end	END CATCHEND/*select * from LAG.usuarios where usuario <> '' declare @msg varchar(max) ;
EXEC @msg=LAG.sp_login 'admin','Xe6b87050bfcb8143fcb8db0170a4dc9ed00d904ddd3e2a4ad1b1e8dc0fdc9be7'
print @msgselect * from LAG.usuarios where usuario <> '' 

update LAG.usuarios set status='1' where idUsuario = 47

*/


